Azure AI Document Intelligenceを使ってみた
はじめに
新規事業部 生成AIチーム 山本です。
ChatGPT(OpenAI API)をはじめとしたAIの言語モデル(Large Language Model:以下、LLM)を使用して、チャットボットを構築するケースが増えています。通常、LLMが学習したときのデータに含まれている内容以外に関する質問には回答ができません。そのため、例えば社内システムに関するチャットボットを作成しようとしても、素のLLMでは質問に対してわからないという回答や異なる知識に基づいた回答が(当然ながら)得られてしまいます。
この問題を解決する方法として、Retrieval Augmented Generation(以下、RAG)という手法がよく使用されます。RAGでは、ユーザからの質問に回答するために必要そうな内容が書かれた文章を検索し、その文章をLLMへの入力(プロンプト)に付け加えて渡すことで、ユーザが欲しい情報に関して回答させることができます。
以前の記事では、RAGを構成する際に大きな課題となっている「ドキュメントが意図しない読み込まれ方になってしまう」という問題に対して、Claude3にパワーポイントのスクリーンショットを画像として読ませることで、人間が読むような形のテキストに起こせることを確認しました。また、読み込める文字のサイズについても調べた結果、文字サイズがある程度大きくないと読み取れないことがわかりました。
Claude3を使って人間が読むようにパワポ資料を読み込んでみる | DevelopersIO
Claude3で認識できる文字のサイズを簡単に調べてみた | DevelopersIO
この記事では、文字のサイズが小さくても文字起こしするための補助として、OCR AIを使うために、AzureのDocument intelligenceを使ってみた内容について記載します。
試したこと(Document intelligenceの実行方法)
今回は(APIからではなく)Azureポータル上にある、Document Intelligence Studioから実行しました。
Document Intelligenceのリファレンスはこちらです。
AzureのDocument intelligenceにアクセス
Azureのポータルにアクセスしました
検索窓で「Document」と入力し、Document intelligenceを選択しました
リソースを作成
Document intelligenceのページに移動した後、ページ上部の「Create」を選択しました
以下のように設定しました
- Subscription:自分の使いたいものを設定
- リージョン:East US
- Pricing Tier:Free F0
(画像では、Standart S0を選んでいますが、これは一つ前に作成したリソースがFreeで作成したため、選択できなかったためです(一つ前のリソースは削除したものの、設定が反映されず残り続けているようです))
※ 日本リージョンでもリソースの作成と、OCRの実行は可能です。ただし、いくつか機能が制限されます。後述のようなMarkdownでの出力をさせるなどの機能を使いたい場合は、プレビューなAPIバージョンを使う必要があり、このためには対応している海外リージョンを選択する必要があります。以下のリージョンでのみ使用できます。
- East US
- West US2
- West Europe
リソースが作成されるまで待ち、作成が完了したら表示される「Go to Resource」ボタンを押しました
Studioにアクセス
作成されたリソースのページにある「Try it」ボタンを押しました
実行
Document Intelligence Studioに移動したら、「Layout」の「Try it out」を押しました
自分の場合は「アカウントを選択する」という画面が表示されたので、使用するアカウントを押しました(表示されないケースもあると思います)
「Form Recognizer Not Found」というウィンドウが表示されたので、Cancelを選択しました
「Configure service resource」に関するウィンドウが表示されたので、以下のように設定し、「Continue」ボタンを押しました
- Subscription・Resource Group:使いたいものを設定
- Document Intelligence or Cognitive Service Resource:先ほど作成したものと同じ名前のものをプルダウンから選択
「Review」のウィンドウが表示されたので、「Finish」ボタンを押しました
「Layout」を実行するページに移動しました。(このモデルは、事前学習済みのモデルで、ドキュメントからテキストと構造 (表、タイトル、段落、選択マーク) を検出して抽出できます。Document Intelligenceには他にも、領収書や請求書など、それぞれに適したモデルが提供されていて、それを選択することも可能なようです)
- 「API Version」として「2024-02-29」を選択しました
※ 今回使用したAPIのバージョンは、現在プレビュー状態です。本番利用は推奨されませんので、ご注意ください。
-
「Analysis options」ボタンを押し、以下のように設定し、「Save」ボタンを押しました
- Run analysis range:Current document
- Page range:All pages
- Output format style:Markdown
左上のエリアに、画像ファイルをドラッグ&ドロップすると、ファイルがアップロードされました
「Run analysis」ボタンを押しました
実行が終わったら、右側に表示される「Markdown」「Text」で、結果を確認しました。
(一つ上の「Result」タブを見ると、それ以外も含んだすべての認識結果がわかります)
使用した画像
前回の記事で使用したものと、同じ画像を使用しました。サイズは、前回の記事で読み取りにミスがあった、以下の2つを使用しました。
- 中:733 x 391、1文字あたり:13px程度、カードサイズ
- 小:367 x 195、1文字あたり:7px程度、サムネイルサイズ(小さめ、拡大してみると文字が少し潰れている)
(前回の結果は以下のとおりでした)
Opus | Sonnet | Haiku | |
---|---|---|---|
画像サイズ:オリジナル | ◎ 合ってる |
◎ 合ってる |
◎ 合ってる |
画像サイズ:大 | ◎ 合ってる |
◯ ほぼ合ってる (ミス3箇所) |
◯ ほぼ合ってる (ミス2箇所) |
画像サイズ:中 | ◯ ほぼ合ってる (ミス2箇所) |
△ 間違い (文脈は合ってる) |
△ 間違い (文脈は合ってる) |
画像サイズ:小 | ✕ 間違い |
✕ 間違い |
✕ 間違い |
結果
共通
「Markdown」の結果では、Markdownのように書き起こされたテキストが出力されました。出力内容は後述のとおりです。
「Text」では、各行がバウンディングボックスで囲まれ、アノテーションと認識結果が表示されました。どちらも、文字部分が正しく囲われていました。(認識結果の様子がわかりやすくて、とても便利ですね!)
画像サイズ中の場合:
「Markdown」の出力は以下のとおりでした
起こした文字はすべて合っていました。
旅程: •Day 1: 金閣寺⇒銀閣寺⇒哲学の道。夜は祇園を散策し、「#京都グルメ」を楽しみます。 •Day 2: 清水寺⇒伏見稲荷大社。ここでは、赤い鳥居が印象的な「伏見稲荷大社」を訪れます。 飛行機のチケットは、事前にウェブサイトで予約しました。ホテルは予約サイトで探し、中心地に近いコ ンビニエントな場所を選びました。 食事: ·京都では、さまざまな料理を試しました。特に、「寿司」「ラーメン」「抹茶スイーツ」は絶品でした。 ●「特注 京都限定の抹茶ビール」も試す価値あり! 気に入った場所: 1.「金閣寺」-金ピカの外観が美しい。 2.「清水寺」-木造の舞台からの眺めが最高。 3.「伏見稲荷大社」-無数に続く鳥居をくぐる体験は唯一無二。 感想: この旅行で、文化と自然の美しさを存分に感じることができました。特に、伝統とモダンが融合する京都 の街並みは、忘れがたい印象を残しました。また、「友人宛にポストカードを送る」という体験も心に 残っています。 次回訪れる際には、秋の「紅葉狩り」を計画しています。京都の美しさを再び体験できることを楽しみに しています。 :unselected:
画像サイズ小の場合
「Markdown」の出力は以下のとおりでした
1行あたり1・2箇所程度、文字起こしミスがありました
旅程: -Day 1:金閣寺⇒銀閣寺⇒哲学の道。夜は祇園を散策し、「京都グルメ」を楽しみます。 -Day 2:清水寺=伏見稻荷大社。ここでは、赤い島届が印象的な「伏見稻荷大社」を訪れます。 飛行機のチケットは、寧前にウェブサイトで予約しました。ホテルは予約サイトで採し、中心地に近いコ ンビニエントな場所を選びました。 食事: ·京都では、さまざまな料理を試しました。特に、「寿司」「ラーメン」「抹茶スイーツ」は絶品でした。 ·「特注京都限定の抹茶ビール」も試す価値あり! 気に入った場所: 1. 「金閣寺」·会ビカの外観が美しい。 2. 「清水寺」-冰造の舞台からの眺めが最高。 3.「优見指荷大社」·無欲に続く鳥居をくぐる体験は唯一無二。 感想: この焼行で、文化と自然の美しさを存分に感じることができました。特に、伝統とモダンが融合する京都 の街並みは、忘れがたい印象を残しました。また、「友人宛にポストカードを送る」という体験もらに 残っています。 次回訪れる際には、秋の「紅葉狩り」を計画しています。京都の美しさを再び体験できることを楽しみに しています。
分析
良かった点
- 前回よりも精度高く文字起こしができた
- 画像サイズ:中
- 前回:SonnetやHaikuだと認識ミスが多かったり(△)、Opusでも数カ所認識ミスがあった(◯)
- 今回:正しく認識できました(◎)
- 画像サイズ:小
- 前回:ほぼ認識できなかった(✕)
- 今回:ある程度認識できた(△~◯)
- 画像サイズ:中
- Markdownの出力もされた
- Markdown的な形式で出力されました
- (今回使用したデータが少しわかりにくいものでした。もう少しMarkdownとして出力するのに適した、表・箇条書き・親子関係が含まれたものにした方が、結果がわかりやすかったかなと反省しています)
- bboxの情報も出力された
- 文字が書かれている位置もわかるので、今後色々と利用できそうです
悪かった点
- 画像サイズが小だと、認識があまり良くはなかった
- 十分なサイズ・解像度になってはいないので、妥当な結果です。こちらのリファレンスを見ると、テキストの最小の高さは12pxとされています。小だと6px程なので、大きさが足りていません。
- カタカナの「コ」が、チェックボックスとして認識され、「:unselected:」という不要なテキストが結果に含まれてしまった
- 今回は調べきれなかったのですが、オプションの設定で排除できるかもしれません(未確認)
- もしくは、出力結果をパースして「:unselected:」を削除する、という簡単な処理でも対処できそうです
料金
料金のページはこちらです。Document Intelligenceはページ数に応じた従量課金制と書かれています。今回使用した「レイアウト」モデルは、「1000ページあたり10ドル」なので、1ページあたり1.5円程度と計算できます。
https://azure.microsoft.com/ja-jp/pricing/details/ai-document-intelligence/
片付け(削除)
作成したDocument intelligenceのリソースは、不要でしたら削除してください
まとめ
AzureのDocument Intelligenceによって、OCRを動かすことができました。前回よりも文字起こしの精度が高く、文字起こしのミスを減らす補助として使用できそうです。
こうした既存のAIと新しいLLMは長所短所があるので、うまく使い分けたり組み合わせることが大事だと思います。
補足
API実行用のコード
Studioの実行画面で、右ペインの「Code」タブを開くと、実行用のコードが表示されます。次回以降は、こちらを使ってみようと思います(最近こういう親切なものが増えててありがたいですね)
読み込み可能なファイルの種類
今回使用した「Layout」モデルは、PDFファイル、各画像ファイル(画像:JPEG/JPG、PNG、BMP、TIFF、HEIF)や、Officeファイル・HTMLに対応しています。ただし、Officeファイル・HTMLは、現状ではpreviewなAPIバージョンを使う必要がある点にご注意ください。
Freeプラン
Freeプランでも同様の抽出機能が使えますが、APIをコールできる回数制限があります。詳しくはプラン表をご覧ください。また、Freeプランだと、PDFファイルは2ページまでしか読み込まれないので、ご注意ください。Analyze optionsのPremium detectionというオプションも使用できません。
これらの制限をなくしたい場合は、S0プランに変更する必要があります。
https://azure.microsoft.com/ja-jp/pricing/details/ai-document-intelligence/
他のOCRサービス
AWSやGoogle Cloudにも、同様のOCRサービスがありますが、以下のような点が気になり、今回はAzureのDocument Intelligenceを使用しました。
AWSの場合
AWSのTextract(やRekognition)が該当するサービスですが、現状では日本語に対応していません
https://aws.amazon.com/jp/textract/faqs/
https://hanlabo.co.jp/memorandum/2678/
対応策としては、自分で日本語対応のOSSなモデルを利用する、といったことが必要そうです
Google Cloudの場合
Google Cloudの場合は、Vision APIのOCRが利用でき、日本語に対応しています。ただ、いくつか対応していない機能があるようです。